package com.apps.java.javanote02;

import java.io.OutputStream;
import java.net.Socket;

public class _25网络编程_TCP通信程序 {
    /**
     * TCP通信原理
     * 	一、概述：
     * 		TCP通信协议是一种可靠的网络协议，它在通信的两端各建立一个Socket对象，从而在通信的两端形成网络虚拟链路，
     * 		一旦建立了虚拟的网络链路，两端的程序就可以通过虚拟链路进行通信。
     *  	Java对基于TCP协议的网络提供了良好的封装，使用Socket对象来代表两端的通信端口，并通过Socket产生IO
     *  	流来进行网络通信
     *  	java为客户端提供了Socket类，为服务端提供了ServerSocket类
     *
     * 	二、TCP协议
     * 		1.传输控制协议(Transmission Control Protocol)
     * 		2.TCP协议是面向连接的通信协议，即传输数据之前，在发送端和接收端建立逻辑连接，然后再传输数据，
     * 			它提供 两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端，由客户端
     * 			向服务端发送连接请求，每次连接的创建都需要经过“三次握手"
     * 		3.三次握手：在TCP协议中，在发送数据的准备阶段，客户端与服务器之间的三次交互，以保证连接的可靠
     * 			（1）第一次握手：客户端想服务器端发送链接请求，等待服务器确认
     * 			（2）第二次握手：服务器端向客户端回送一个响应，通知客户端收到了连接请求
     * 			（3）第三次握手：客户端再次想服务器端发送确认信息，确认连接
     * 		由于面向连接的特性，TCP协议可以保证传输数据的安全，所以应用十分广泛。例如上传文件、下载文件、浏览网页等。
     *
     * 	三、TCP发送数据
     * 		发送数据的步骤
     * 		1.创建客户端的Socket对象
     * 			Socket(String host, int port)
     * 		2.获取输出流，写数据
     * 			OutputStream getOutputStream()
     * 		3.释放资源
     * 			void close()
     *
     * 	四、TCP接收数据
     * 		接收数据的步骤
     * 		1.创建服务器端的Socket对象(ServerSocket)
     * 			ServerSocket(int prot)
     * 		2.获取输入流，读数据，并把数据显示在控制台
     * 			Socket accept()
     * 		3.释放资源
     * 			void close;
     *
     * 	五、结束标记
     * 		代码中可能会出现程序一直等待的情况，原因是读数据的方式是阻塞式的
     * 		解决方法：
     * 			1.自定义结束标记
     * 			2.使用shutdownOutput()方法（推荐）
     *
     *
     *
     *
     */

    public static void main(String[] args) throws Exception {


        //发送数据
        //创建客户端的Socket对象
//		Socket(InetAddress address, int port)创建流套接字并将其连接到指定IP地址的指定端口号
//		Socket so = new Socket(InetAddress.getByName("192.168.43.17"), 301121);
        //Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号
        Socket so = new Socket("祎只大鹅鹅鹅", 10000);

        //获取输出流，写数据
        //OutputStream getOutputStream()：返回此套接字的输出流
        OutputStream os = so.getOutputStream();
        os.write("helloTCP，我来了".getBytes());

        //释放资源
        so.close();

        System.out.println("结束");
    }
}
